package cn.cdqf.zuul.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import lombok.extern.slf4j.Slf4j;

import javax.servlet.http.HttpServletRequest;

//模板方法模式提取公共的方法,帮忙实现,其他类继承这个类,可以不用实现这些公共的方法
@Slf4j
public abstract class AbstractZuulFilter extends ZuulFilter {

    //可以在所有的filter中传递数据,只能对当前线程生效,threadlocal+concurrenthashmap
    RequestContext requestContext;

    //定义能不能走到下一步,作为一个key,如果第一个放过了就设置为true,
    static final String NEXT="next";
    @Override
    //所有自定义的filter都用这个判断
    public boolean shouldFilter() {
        //初始化
        requestContext = RequestContext.getCurrentContext();
        //默认值为true,因为第一次来的时候需要放过,第一个取不到这个值,默认值为true,先走这里再走run方法
        return requestContext.getBoolean(NEXT,true);
    }

    public Object fail(int code,String msg){
        requestContext.set(NEXT,false);
        HttpServletRequest request = requestContext.getRequest();
        log.info("当前请求失败: {},url: {}",this.getClass().getName(),request.getRequestURI());
        //前面请求已经凉了,告诉zuul不需要去走了
        requestContext.setSendZuulResponse(false);
        //zuul不去请求微服务了,拿不到本来应该拿到的返回值,zuul应该自己定义返回值
        requestContext.setResponseStatusCode(code);
        requestContext.getResponse().setContentType("application/json;charsst=utf-8");
        //写返回值的信息
        requestContext.setResponseBody(msg);
        return null;
    }
    public Object success(){
        //下一个过滤器就可以接收到这个消息
        requestContext.set(NEXT,true);
        return null;
    }
}
